﻿using ICSharpCode.AvalonEdit.CodeCompletion;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Editing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LunarSF.SHomeWorkshop.LunarMarkdownEditor
{

    /// <summary>
    /// 表示自动完成列表中的某个项目。
    /// </summary>
    public class CustomCompletionData : ICompletionData
    {
        public CustomCompletionData(string text, string description, string completeText = null, string keyWordType = "", System.Windows.Media.Brush keyWordForeground = null)
        {
            this.Text = text;
            this.description = description;

            if (completeText == null)
            {
                this.completeText = this.Text;
            }
            else
            {
                this.completeText = completeText;
            }

            /*lme*/
            KeyWordType = keyWordType;

            if(keyWordForeground != null)
            {
                KeyWordForeground = keyWordForeground;
            }
        }

        public System.Windows.Media.Brush KeyWordForeground { get; set; } = System.Windows.Media.Brushes.Black;

        /// <summary>
        /// 是否已废弃。
        /// </summary>
        public bool IsObsoleting { get; set; } = false;

        private string completeText;
        /// <summary>
        /// 自动完成文本。
        /// </summary>
        public string CompleteText
        {
            get { return this.completeText; }
        }

        private System.Windows.Media.ImageSource image;

        /// <summary>
        /// 自动完成项目的图标。
        /// </summary>
        public System.Windows.Media.ImageSource Image
        {
            get { return image; }
            set { image = value; }
        }

        public string KeyWordType { get; set; } = "";

        public string Text { get; private set; }

        // Use this property if you want to show a fancy UIElement in the list.
        public object Content
        {
            get { return this.Text; }
        }

        private string description;
        /// <summary>
        /// 此条目的描述信息。
        /// </summary>
        public object Description
        {
            get { return this.description; }
        }

        public CompleteItemType Type { get; set; } = CompleteItemType.Normal;

        /// <summary>
        /// 自动完成（上屏）
        /// </summary>
        /// <param name="textArea">目标文本区域。</param>
        /// <param name="completionSegment">自动完成片段。</param>
        /// <param name="insertionRequestEventArgs">插入请求事件参数。</param>
        public void Complete(TextArea textArea, ISegment completionSegment,
            EventArgs insertionRequestEventArgs)
        {
            var keArgs = insertionRequestEventArgs as System.Windows.Input.KeyEventArgs;
            if (keArgs != null)
            {
                switch (keArgs.Key)
                {
                    case System.Windows.Input.Key.Enter:
                    case System.Windows.Input.Key.Tab:
                        {
                            // Enter Tab 自动完成，不加空格，方便继续输入 . 运算符。
                            textArea.Document.Replace(completionSegment, this.CompleteText/* + " "*/);
                            keArgs.Handled = true;  // 这里需要加
                            break;
                        }
                    case System.Windows.Input.Key.Space:
                        {
                            // Space 自动完成，加空格，方便继续输入其它运算符。
                            textArea.Document.Replace(completionSegment, this.CompleteText + " ");
                            keArgs.Handled = true;  // 这里需要加
                            break;
                        }
                    case System.Windows.Input.Key.D1:
                        {
                            // 一定是带 Shift 的，所以实际是 !
                            textArea.Document.Replace(completionSegment, this.CompleteText + " != ");
                            break;
                        }
                    case System.Windows.Input.Key.D5:
                        {
                            // 一定是带 Shift 的，所以实际是 %
                            textArea.Document.Replace(completionSegment, this.CompleteText + " %");  // 无法支持 %=
                            break;
                        }
                    case System.Windows.Input.Key.D6:
                        {
                            // 一定是带 Shift 的，所以实际是 %
                            textArea.Document.Replace(completionSegment, this.CompleteText + " ^");  // 无法支持 %=
                            break;
                        }
                    case System.Windows.Input.Key.D7:
                        {
                            // 一定是带 Shift 的，所以实际是 %
                            textArea.Document.Replace(completionSegment, this.CompleteText + " &");  // 无法支持 %=
                            break;
                        }
                    case System.Windows.Input.Key.D8:
                        {
                            // 一定是带 Shift 的，所以实际是 *
                            textArea.Document.Replace(completionSegment, this.CompleteText + " *");  // 无法支持 *=
                            break;
                        }
                    case System.Windows.Input.Key.OemPlus:
                        {
                            if(keArgs.KeyboardDevice.Modifiers == System.Windows.Input.ModifierKeys.Shift)
                            {
                                // 一定是带 Shift 的，所以实际是 +
                                textArea.Document.Replace(completionSegment, this.CompleteText + " +");  // 无法支持 +=
                            }
                            else
                            {
                                // 不带 Shift 的，所以实际是 =
                                // 当发现前面的文本以 " !"、" ^"、" +"、" -" 之类结尾时，按 = 号自动添加空格
                                //     这个处理放在 PythonEditor.xaml.cs 的 PythonEditor_PreviewTextInput 事件中处理。
                                textArea.Document.Replace(completionSegment, this.CompleteText + " =");  // 无法支持 +=
                            }
                            break;
                        }
                    case System.Windows.Input.Key.OemMinus:
                        {
                            // 一定是不带 Shift 的，所以实际是 -
                            textArea.Document.Replace(completionSegment, this.CompleteText + " -");  // 无法支持 +=
                            break;
                        }
                    case System.Windows.Input.Key.OemComma:
                        {
                            // 一定是带 Shift 的，所以实际是 <
                            textArea.Document.Replace(completionSegment, this.CompleteText + " <");  // 无法支持 +=
                            break;
                        }
                    case System.Windows.Input.Key.OemPeriod:
                        {
                            // 一定是带 Shift 的，所以实际是 >
                            textArea.Document.Replace(completionSegment, this.CompleteText + " >");  // 无法支持 +=
                            break;
                        }
                    case System.Windows.Input.Key.OemQuestion:
                        {
                            // 一定是不带 Shift 的，所以实际是 /
                            textArea.Document.Replace(completionSegment, this.CompleteText + " /");  // 无法支持 +=
                            break;
                        }
                    case System.Windows.Input.Key.OemPipe:
                        {
                            // 一定是带 Shift 的，所以实际是 >
                            textArea.Document.Replace(completionSegment, this.CompleteText + " |");  // 无法支持 +=
                            break;
                        }
                }
            }
            else
            {
                textArea.Document.Replace(completionSegment, this.CompleteText);
            }

            // Globals.SwitchInputMethod(false);
            
            OnComplete(this, insertionRequestEventArgs);
        }

        /// <summary>
        /// 优先权。本例中不需要它。
        /// </summary>
        public double Priority
        {
            get { return 0; }
        }

        /// <summary>
        /// 上屏后向后移动光标。例如：
        ///     置数字()
        /// 将此值设置为 1，上屏后可以用 Complete 事件直接定位到括号内部。
        /// </summary>
        public int? BackSelectOffset { get; set; }
        public string Suffix { get; internal set; }

        /// <summary>
        /// 前缀名，目前只用于在输入类的静态方法时，自动上屏类名（在左侧尾字符不是.时）。
        /// </summary>
        public string PrefixClassName { get; internal set; } = null;

        /// <summary>
        /// “自动完成”动作发生后触发此事件。
        /// </summary>
        public event EventHandler<EventArgs> Completed;

        /// <summary>
        /// 用于触发“Completed”事件。
        /// </summary>
        protected void OnComplete(object sender, EventArgs e)
        {
            if (this.Completed != null)
            {
                this.Completed(sender, e);
            }
        }
    }

    public enum CompleteItemType
    {
        Normal,                         //之前
        MarkdownFileLink,               //普通MD文件链接
        MetaMarkdownFileLink,           //目录对应的元文件的链接
        ImageResourceLink,              //图像资源文件
    }
}
